package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Vector;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

import vista.VistaOrden;
import vista.VistaOrdenListarDecorator;
//import modelo.ModeloCategoria;
//import modelo.ModeloDetalleProducto;
//import modelo.ModeloIngredientes;
//import modelo.ModeloDetalleProducto;
//import modelo.ModeloIngredientes;
import modelo.ModeloCliente;
import modelo.ModeloDetalleOrden;
import modelo.ModeloOrden;
import modelo.ModeloProductos;
import Utilidades.ObjetoCombo;

public class ControladorOrden  extends WindowAdapter implements ActionListener, WindowListener {

	private VistaOrden vista;
	private ModeloProductos modeloproducto;
	private ModeloOrden modeloorden;
	private int fila = 0;
	
	public  void Limpiar(){
		
		fila=0;
		vista.getTxtCodigo().setText("");
		vista.getTxtCedula().setText("");
		vista.getTxtFecha().setText("");		
		vista.getTxtProductos().setSelectedItem(null);
		vista.getTxtcantidad().setText("");
		vista.getTxtnombre().setText("");
		vista.getTxtTotal().setText("0");
		
		for(int i=0; i<vista.getTabla().getRowCount(); i++)
			for(int f=0; f<5; f++)
				vista.getTabla().setValueAt("", i, f);
		
	}
	
	public  void limpiar2(){
		fila=0;
		vista.getTxtCodigo().setText("");
		vista.getTxtCedula().setText("");
		vista.getTxtFecha().setText("");
		vista.getTxtProductos().setSelectedItem(null);
		vista.getTxtcantidad().setText("");
		vista.getTxtTotal().setText("0");
		
		for(int i=0; i<vista.getTabla().getRowCount(); i++)
			for(int f=0; f<5; f++)
				vista.getTabla().setValueAt("", i, f);
		
	}
	
	public ControladorOrden(VistaOrden vista){
		
		super();
		this.vista = vista;
		this.modeloproducto = new ModeloProductos();
		this.modeloorden = new ModeloOrden();
	}
	
	
	public void windowClosing(WindowEvent e){
		vista.dispose();
	}
	
	public void windowOpened(WindowEvent arg0) {
		//System.out.println("entro a cargar");
		cargarProducto();
		vista.getTxtProductos().setSelectedItem(null);
	}

	
	
	public void mostrarInfo(ModeloOrden orden){
		
		limpiar2();
		vista.getTxtCodigo().setText(orden.getId());
		vista.getTxtCedula().setText(orden.getCedula());
		vista.getTxtFecha().setText(orden.getFecha());
		vista.getTxtTotal().setText(Double.toString(orden.getTotal()));
		
		ModeloCliente mc = new ModeloCliente();
		mc = mc.existe(vista.getTxtCedula().getText());
		vista.getTxtnombre().setText(mc.getNombre());
		
		Iterator<ModeloDetalleOrden> itera = orden.getvOrden().iterator();
		
		
		while (itera.hasNext()){		
			
		    ModeloDetalleOrden elemento = itera.next();		    
		    
		    vista.getTabla().setValueAt(elemento.getId_producto(), fila, 0);			
			vista.getTabla().setValueAt(Integer.toString(elemento.getCantidad()), fila, 2);			
			vista.getTabla().setValueAt(Double.toString(elemento.getPrecio()), fila, 3);			
			vista.getTabla().setValueAt(Double.toString(elemento.getSubtotal()), fila, 4);						
			ModeloProductos producto = modeloproducto.existe(orden.getvOrden().elementAt(fila).getId_producto());			
			vista.getTabla().setValueAt(producto.getDescripcion(), fila, 1);						
			fila++;
					
		}
		
		
	}
	
		
	public void cargarProducto(){
		
		ResultSet rs;
		rs = modeloproducto.listar();   //mTipoEjemplar.listarTipoEjemplar();
		try {
			
			while (rs.next()){
				ObjetoCombo objetoCombo = new ObjetoCombo(rs.getString("id"),rs.getString("descripcion"));
				vista.getTxtProductos().addItem(objetoCombo);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public void actionPerformed(ActionEvent ae) {
	
		ModeloOrden encontrado = null;
		
		// BUSCAR
		if(ae.getActionCommand().equalsIgnoreCase(vista.getBtnBuscar().getText())){			
			buscar();				
		}		
		//guardar		
		if(ae.getActionCommand().equalsIgnoreCase(vista.getBtnGuardar().getText())){			
			guardar(encontrado);					
		}
			
		if (ae.getActionCommand().equalsIgnoreCase(vista.getBtnCancelar().getText())){
				Limpiar();
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vista.getBtnModificar().getText())){			
			modificar(encontrado);
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vista.getBtnIncluir().getText())){
			incluirProducto();
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vista.getBtnSalir().getText())){
			vista.dispose();
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vista.getBtnFila().getText())){			
			eliminarFila();			
		}		
		//ELIMINAR
		if (ae.getActionCommand().equalsIgnoreCase(vista.getBtnEliminar().getText())){			
			eliminar();
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vista.getBtnBCedula().getText())){			
			buscarPersona(vista.getTxtCedula().getText());
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vista.getBtnListar().getText())){	
			
			new VistaOrdenListarDecorator(vista, this);
		}
		
	}
	
	public void buscarPersona(String cedula)
	{
		ModeloCliente mC=new ModeloCliente();
		
		mC =mC.existe(cedula);
		
		if (mC!=null)
		{
			vista.getTxtnombre().setText(mC.getNombre());
		}
		
	}
	
	public void eliminarFila()
	{
		int filaE=vista.getTabla().getSelectedRow();
		
		if (vista.getTabla().getValueAt(filaE, 4)!=""){
				fila--;
				
				vista.getTxtEFila().setText(Integer.toString(filaE));
				vista.getTabla().setValueAt("", filaE,0);
				vista.getTabla().setValueAt("", filaE,1);
				vista.getTabla().setValueAt("", filaE,2);
				vista.getTabla().setValueAt("", filaE,3);
				double subtotal = Double.parseDouble(vista.getTabla().getValueAt(filaE, 4).toString());
				
				vista.getTabla().setValueAt("", filaE,4);
				
						
				int filaAux;
				for(int i=filaE; i<vista.getTabla().getRowCount();i++)
				{
					filaAux=i+1;
					if (filaAux< vista.getTabla().getRowCount()){
					
						if(vista.getTabla().getValueAt(filaAux,1)!="")
						{
							vista.getTabla().setValueAt(vista.getTabla().getValueAt(filaAux, 0),i,0);
							vista.getTabla().setValueAt(vista.getTabla().getValueAt(filaAux, 1),i,1);
							vista.getTabla().setValueAt(vista.getTabla().getValueAt(filaAux, 2),i,2);
							vista.getTabla().setValueAt(vista.getTabla().getValueAt(filaAux, 3),i,3);
							vista.getTabla().setValueAt(vista.getTabla().getValueAt(filaAux, 4),i,4);
				
						}else{
							
							vista.getTabla().setValueAt("",i,0);
							vista.getTabla().setValueAt("",i,1);
							vista.getTabla().setValueAt("",i,2);
							vista.getTabla().setValueAt("",i,3);
							vista.getTabla().setValueAt("",i,4);
							
												
						}
					}
				}
				
				double total = Double.parseDouble(vista.getTxtTotal().getText()) - subtotal;
				vista.getTxtTotal().setText(Double.toString(total));
		}
		
		
	}
	
	//private void buscar(ModeloOrden encontrado)
	public void buscar()
	{
		
		modeloorden = modeloorden.buscarOrden(vista.getTxtCodigo().getText());
		String mensaje;
		int tipoMensaje;
		
		if (modeloorden == null)
		{
			mensaje = "No se econtro el codigo";
			tipoMensaje = JOptionPane.INFORMATION_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(), mensaje,"Sistema la <<Guapa>>    Comida Rapida",
					  tipoMensaje);
			Limpiar();
			
		}else
		{
			//System.out.println(Double.toString(modeloorden.getvOrden().elementAt(0).getPrecio()));
			mostrarInfo(modeloorden);
			//mostrarInfo(encontrado);
			
		}
	}
	
	
	private void llenarVector(Vector<ModeloDetalleOrden> vOrden){
		
	int fila=vista.getTabla().getRowCount();
	
	for (int i=0;i<fila;i++){
		
			if(vista.getTabla().getValueAt(i,1).toString() != "")
			{
				//vista.getTabla().setValueAt(vista.getTxtCodigo().getText(), i, 0);
				
				String id_orden = vista.getTxtCodigo().getText();
				String id_producto = vista.getTabla().getValueAt(i,0).toString();				
				int cantidad = Integer.parseInt(vista.getTabla().getValueAt(i,2).toString());
				double precio = Double.parseDouble(vista.getTabla().getValueAt(i,3).toString());
				double subtotal = Double.parseDouble(vista.getTabla().getValueAt(i,4).toString());
				
				ModeloDetalleOrden actual = new ModeloDetalleOrden(id_orden, id_producto, cantidad, precio, subtotal);
				vOrden.addElement(actual);
				
			}
		}
	}
	
	public void guardar(ModeloOrden encontrado)
	{
		
		int tipoMensaje=0;
		String mensaje="";
		@SuppressWarnings({ "rawtypes", "unchecked" })
		Vector<ModeloDetalleOrden> vOrden = new Vector();		
		llenarVector(vOrden);
		
		if(vOrden.size()>0)
		{
			ModeloOrden encontrada;		
			modeloorden = new ModeloOrden(vista.getTxtCodigo().getText(), vista.getTxtCedula().getText(),vista.getTxtFecha().getText(),Double.parseDouble(vista.getTxtTotal().getText()), vOrden);
			
				encontrada = modeloorden.existe(modeloorden.getId());
								
				if (encontrada == null){
					
					modeloorden.registar(modeloorden);
					mensaje="Orden ingresada exitosamente";
					tipoMensaje = JOptionPane.INFORMATION_MESSAGE;
					JOptionPane.showMessageDialog(new JPanel(), mensaje,"Sistema <<La Guapa>>    Comida Rapida",tipoMensaje);
					//Limpiar();
				
				}else{
					
					mensaje = "La Orden que esta intentando ingresar ya se encuentra registrada";
					tipoMensaje = JOptionPane.WARNING_MESSAGE;
					JOptionPane.showMessageDialog(new JPanel(), mensaje,"Sistema <<La Guapa>>    Comida Rapida",tipoMensaje);
				}
		}
		else
		{
			mensaje = "Debe ingresar al menos un producto";
			tipoMensaje = JOptionPane.WARNING_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(), mensaje,"Sistema <<La Guapa>>    Comida Rapida",tipoMensaje);
		}
			
	}
	
	
	private void modificar(ModeloOrden encontrado){
		
		String mensaje;
		int tipoMensaje;
		@SuppressWarnings({ "rawtypes", "unchecked" })
		Vector<ModeloDetalleOrden> vOrden = new Vector();
		
		modeloorden.setId(vista.getTxtCodigo().getText());
		modeloorden.setCedula(vista.getTxtCedula().getText());
		modeloorden.setFecha(vista.getTxtFecha().getText());
		
		llenarVector(vOrden);
		
		//ModeloProductos actual = new ModeloProductos (vista.getTxtCodigo().getText(), vista.getTxtDescripcion().getText(), Double.parseDouble(vista.getTxtPrecio().getText()), Double.parseDouble(vista.getTxtCosto().getText()),objetoCombo.getCodigo());
		
		ModeloOrden modeloorden = new ModeloOrden(vista.getTxtCodigo().getText(), vista.getTxtCedula().getText(),vista.getTxtFecha().getText(), Double.parseDouble(vista.getTxtTotal().getText()), vOrden);
		
		
		ModeloOrden encontrada= modeloorden.existe(modeloorden.getId());
		
		if (encontrada == null){
			
			mensaje = "Error La orden no modificada";
			tipoMensaje = JOptionPane.WARNING_MESSAGE;
			Limpiar();					

		}else{
		
			modeloorden.modificar();
			mensaje="Orden Modificada";
			tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
			Limpiar();
		}
		
	}
	
	private void incluirProducto(){
		
		
		double subtotal=0;
		double total=0;
		
		if (vista.getTxtProductos().getSelectedItem()!=null){
			
				if (!vista.getTxtcantidad().getText().trim().equals("")){
					
					if (Integer.parseInt(vista.getTxtcantidad().getText()) > 0){
						
						ObjetoCombo oC = (ObjetoCombo) vista.getTxtProductos().getSelectedItem();
						
						if(modeloproducto.validarproducto(oC.getCodigo(), Integer.parseInt(vista.getTxtcantidad().getText())))
						{
									modeloproducto=modeloproducto.existe(oC.getCodigo());
						
									vista.getTabla().setValueAt(oC.getCodigo(), fila, 0);
									vista.getTabla().setValueAt(oC.getNombre(), fila, 1);
									vista.getTabla().setValueAt(vista.getTxtcantidad().getText(), fila, 2);
									vista.getTabla().setValueAt(Double.toString(modeloproducto.getPrecio()), fila, 3);
									subtotal=modeloproducto.getPrecio()*Double.parseDouble(vista.getTxtcantidad().getText());
									
									vista.getTabla().setValueAt(Double.toString(subtotal), fila, 4);
									
									if(vista.getTxtTotal().getText().equals("")){vista.getTxtTotal().setText("0");}
									
									total = Double.parseDouble(vista.getTxtTotal().getText())+subtotal;
									
									vista.getTxtTotal().setText(Double.toString(total));
									
									fila++;
						}
						else {
							
							String mensaje="Disculpe, No hay ingredientes suficientes para la orden";
							int tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
							JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
						}
						
					}else {
						
						String mensaje="Disculpe, inserte una cantidad mayor a cero (0)";
						int tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
						JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
					}
					
				}else {
					
					String mensaje="Disculpe, inserte una cantidad mayor a cero (0)";
					int tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
					JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
				}
		}else {
			
			String mensaje="Disculpe, debe seleccionar un producto";
			int tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
		}
	}
	
	private void eliminar()	
	{
		String mensaje="";
		int tipoMensaje;
		
		modeloorden.setId(vista.getTxtCodigo().getText());
		modeloorden.setCedula(vista.getTxtCedula().getText());	
		@SuppressWarnings("unused")
		ObjetoCombo objetoCombo = (ObjetoCombo) vista.getTxtProductos().getSelectedItem();
		
		ModeloOrden actual = new ModeloOrden (vista.getTxtCodigo().getText(), vista.getTxtCedula().getText(),vista.getTxtFecha().getText(), Double.parseDouble(vista.getTxtTotal().getText()));		
		ModeloOrden encontrada=modeloorden.existe(actual.getId());
		
		if (encontrada == null){
			mensaje = "Error: Orden no Eliminada";
			tipoMensaje = JOptionPane.WARNING_MESSAGE;
			Limpiar();					

		}else{
			modeloorden.eliminar();
			mensaje="Orden Eliminada";
			tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
			Limpiar();
		}
	}
	
}